/*============================================================================*/
/*       UNIVERSIDAD DE GUADALAJARA - CONTINENTAL AUTOMOTIVE SYSTEMS          */
/*============================================================================*/
/*                        OBJECT SPECIFICATION                                */
/*============================================================================*
* %name:            % Rotabit-SoftwareTimers
* %version:         %
* %created_by:      % Roberto Gonzalez /Emmanuel Dominguez
* %date_created:    %
*=============================================================================*/
/* DESCRIPTION : Timers handling                                              */
/*============================================================================*/
/* FUNCTION COMMENT : Provices APIs to configure and use Timers of PIC micro  */
/*                                                                            */
/*                                                                            */
/*============================================================================*/
#include "stdtypedef.h"
#include "p18f4550.h"
#include "hw_timers.h"
#include "core.h"
#include "interrupts.h"
#include "sw_timers.h"

#define TIMER_0	0
#define MY_TIME 500


#pragma config WDT = OFF
#pragma config PBADEN = OFF
#pragma config FOSC = INTOSCIO_EC
/*==================================================*/ 
/* Definition of constants                          */
/*==================================================*/ 
/* BYTE constants */
const T_UBYTE cub_max = (1<<7);
const T_UBYTE cub_min = (1<<0);

/**************************************************************
 *  Name                 : main
 *  Description          : main program, initialize cpu and run aplication
 *  Parameters           :  none
 *  Return               :  none
 *  Critical/explanation :  No
 **************************************************************/
void main(void)
{
	T_UBYTE lub_flag=0;
    //initialize CPU
	initcpu();
	//initialize interrupts
	mw_interrupt_initCfg();
	//initialize ports (including TRISx) 
    TRISD = 0;
	PORTD = 0;
    //initialize timer
	timer0_initCfg();
	sw_timers_InitTimers();
	sw_timers_StartTimer(TIMER_0);
	/* Infinite Loop, wait for an event */
	// this application togle the port b every 500 ms	
	PORTD=cub_min;
	while(1)
	{

		if(sw_timers_IsExpiredTimer(TIMER_0, MY_TIME))
		{
			sw_timers_StopTimer(TIMER_0);
    		if(lub_flag){
				PORTD>>=1;
				if(PORTD==cub_min){	
					lub_flag=0;
				}
			}else{
				PORTD<<=1;
				if(PORTD==cub_max){	
					lub_flag=1;
				}
			}	
    		sw_timers_StartTimer(TIMER_0);
  		}
	}	
}